Manipulate[Module[{howBig=200,Δx,xPartition,leftSumRect,rightSumRect,leftSum,rightSum,trapezoidRect,trapezoidSum,displayTable,anypointRect,midpointRect,anypointSum,midpointSum,parPartition,simpsonFunct,simpsonSum,actualSum,zoomScale,viewDomain},

zoomScale[factor_]=(factor^3);
viewDomain[var_]:={
{var,
-zoomScale[zoomFactor]+viewPt[[1]],zoomScale[zoomFactor]+viewPt[[1]]},
{-zoomScale[zoomFactor]+viewPt[[2]],zoomScale[zoomFactor]+viewPt[[2]]}};


displayTable={
(* Rows for each type of sum are:
1. method to graph each one, 2. area for each one, 3. name of each one, 4. function to plot (True) or Graphics primitives to use (False) to show,
5. whether it should be displayed or not (set dynamically), 6. options to use when graphing *)
{Tooltip[functX,Row[{"Actual area: " ,actualSum}]],simpsonFunct,midpointRect,trapezoidRect,leftSumRect,rightSumRect},{actualSum,simpsonSum,midpointSum,trapezoidSum,leftSum,rightSum},{"Actual","Simpson","Midpoint","Trapezoid","Left","Right"},
{True,True,False,False,False,False},
{actualYN,simpsonYN,midpointYN,trapezoidYN,leftSumYN,rightSumYN},{{EdgeForm[Black],colorTable[[1]],Opacity[0.5]},{EdgeForm[Black],colorTable[[2]],Opacity[0.5]},{EdgeForm[Black],colorTable[[3]],Opacity[0.5]},{EdgeForm[Black],colorTable[[4]],Opacity[0.5]},{EdgeForm[Black],colorTable[[5]],Opacity[0.5]},{EdgeForm[Black],colorTable[[6]],Opacity[0.5]}}};

Δx=Abs[((edgeB[[1]]-edgeA[[1]])/subN)]//N;

xPartition=Transpose[{x,functX}/.x->Range[edgeA[[1]],edgeB[[1]],Δx]];

leftSumRect[rStyle__]=Tooltip[Table[{rStyle,Rectangle[{xPartition[[k,1]],0},{xPartition[[k+1,1]],xPartition[[k,2]]}]},{k,1,subN}],Row[{"Left sum: " ,leftSum}]];

rightSumRect[rStyle__]=Tooltip[Table[{rStyle,Rectangle[{xPartition[[k,1]],0},{xPartition[[k+1,1]],xPartition[[k+1,2]]}]},{k,1,subN}],Row[{"Right sum: " ,rightSum}]];

leftSum=(∑_(k=1)^subN)(xPartition[[k,2]]Δx);

rightSum=(∑_(k=1)^subN)(xPartition[[k+1,2]]Δx);

trapezoidRect[rStyle__]=Tooltip[Table[{rStyle,Polygon[{{xPartition[[k,1]],0},{xPartition[[k,1]],xPartition[[k,2]]},{xPartition[[k+1,1]],xPartition[[k+1,2]]},{xPartition[[k+1,1]],0}}]},{k,1,subN}],Row[{"Trapezoid rule: " ,trapezoidSum}]];

trapezoidSum=(leftSum+rightSum)/2;

anypointRect[position_,rStyle__]:=Table[{rStyle,Rectangle[{xPartition[[k,1]],0},{xPartition[[k+1,1]],anypointHeight[functX,xPartition[[k,1]],Δx,position]}]},{k,1,subN}];

midpointRect[rStyle__]=Tooltip[anypointRect[0.5,rStyle],Row[{"Midpoint sum: " ,midpointSum}]];

anypointSum[position_]:=(∑_(k=1)^subN)(anypointHeight[functX,xPartition[[k,1]],Δx,position]Δx);

midpointSum=anypointSum[0.5];

parPartition=Apply[parabolaThruPts,Partition[xPartition,3,2],{1}];

simpsonFunct=Tooltip[Piecewise[Table[{parPartition[[k]],xPartition[[2k-1]][[1]]≤ x≤xPartition[[2k+1]][[1]]},{k,1,subN/2}]],Row[{"Simpson's rule: " ,simpsonSum}]];

simpsonSum=((Δx)/3)(xPartition[[1,2]]+(∑_(k=2)^subN)((3+(((-1))^k))xPartition[[k,2]])+xPartition[[subN+1,2]]);

actualSum=NIntegrate[functX,{x,edgeA[[1]],edgeB[[1]]}];

Column[
{
Plot[Evaluate[DeleteCases[Flatten[Table[If[displayTable[[4,k]]&&displayTable[[5,k]],displayTable[[1]][[k]]],{k,1,6}]],Null]],Evaluate[viewDomain[x][[1]]],PlotRange->
viewDomain[x][[2]],AxesOrigin->{0,0},Filling->Axis,PlotRange->All,ImageSize->howBig,Evaluate[ControlActive[PlotPoints->10,PlotPoints->Automatic]],FillingStyle->If[displayTable[[5,2]],{1-> displayTable[[6,1]],2-> displayTable[[6,2]]},{1-> displayTable[[6,1]]}],Epilog->Join[{{Red,Line[{{edgeA[[1]],0},{edgeA[[1]],Evaluate[functX/.x->edgeA[[1]]]}}]},{Red,Line[{{edgeB[[1]],0},{edgeB[[1]],Evaluate[functX/.x->edgeB[[1]]]}}]}},Evaluate[DeleteCases[Flatten[Table[If[(!displayTable[[4,k]])&&displayTable[[5,k]],Apply[displayTable[[1,k]],displayTable[[6,k]]]],{k,1,6}]],Null]]]],

Row[{Grid[DeleteCases[Table[If[displayTable[[5,k]],{Style[displayTable[[3,k]],{Bold,FontFamily->"Times",displayTable[[6,k]],FontSize->Small}],Style[displayTable[[2,k]],{Bold,FontFamily->"Times",FontSize->Small}]}],{k,1,6}],Null],Alignment->{Right,"."},Spacings->2,Frame->True,Background->White],

BarChart[Evaluate[Take[displayTable[[2]],-5]],BarLabels->Evaluate[Take[displayTable[[3]],-5]],BarOrientation->Horizontal,Epilog->{Black,Tooltip[Rectangle[{actualSum,0},{1.002actualSum,10}],Row[{"Actual area:",actualSum}]]},PlotRange->All,ImageSize->Round[0.6howBig],BarStyle->Map[Directive,Take[displayTable[[6]],-5]]]}]
}]
],
{{functX,3Cos[x-(x^2)]}},
{{edgeA,{-3,-2}},Locator},
{{edgeB,{π,-2}},Locator},
{{subN,8,"# of subdivisions"},2,60,2,Appearance->"Labeled"},
{{actualYN,True,"Actual"},{True,False},ControlType->None},
{{leftSumYN,False,"Left"},{True,False},ControlPlacement->Right},
{{rightSumYN,False,"Right"},{True,False},ControlPlacement->Right},
{{midpointYN,False,"Midpoint"},{True,False},ControlPlacement->Right},
{{trapezoidYN,False,"Trapezoid"},{True,False},ControlPlacement->Right},
{{simpsonYN,False,"Simpson"},{True,False},ControlPlacement->Right},
{{viewPt,{0,0},""},{-10,-10},{10,10},ControlPlacement->Right},
{{zoomFactor,1.5,""},6,0.1,ControlType->Slider,ControlPlacement->Bottom},


Initialization:>( 
(* I used Solve in advance on the general form to save a little computation time during the Manipulation *)

parabolaThruPts[ptA_,ptB_,ptC_]:=a (x^2)+b x+c /.Flatten[{{a->(ptA[[2]] (ptB[[1]]-ptC[[1]])+ptB[[2]] ptC[[1]]-ptB[[1]] ptC[[2]]+ptA[[1]] (-ptB[[2]]+ptC[[2]]))/((ptA[[1]]-ptB[[1]]) (ptA[[1]]-ptC[[1]]) (ptB[[1]]-ptC[[1]])),b->(-ptB[[2]] ((ptC[[1]])^2)+ptA[[2]] (-((ptB[[1]])^2)+((ptC[[1]])^2))+((ptA[[1]])^2) (ptB[[2]]-ptC[[2]])+((ptB[[1]])^2) ptC[[2]])/((ptA[[1]]-ptB[[1]]) (ptA[[1]]-ptC[[1]]) (ptB[[1]]-ptC[[1]])),c->(ptA[[2]] ptB[[1]] (ptB[[1]]-ptC[[1]]) ptC[[1]]+ptA[[1]] (ptB[[2]] ((ptC[[1]])^2)-((ptB[[1]])^2) ptC[[2]]+ptA[[1]] (-ptB[[2]] ptC[[1]]+ptB[[1]] ptC[[2]])))/((ptA[[1]]-ptB[[1]]) (ptA[[1]]-ptC[[1]]) (ptB[[1]]-ptC[[1]]))}}];

anypointHeight[functionOfX_,leftXValue_,deltaX_,positionInInterval_]:=functionOfX/.x->(leftXValue+positionInInterval deltaX);

Needs["BarCharts`"];

colorTable=Table[ColorData[15,"ColorList"][[k]],{k,1,6}];
)
]